package principal;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Camera {
/*
 * | -200 -50 300                          | ; Ponto da camera
| 0.667 0.172 -1                        | ; Vetor N
| 0 3 0                                 | ; Vetor V
| 65 0.5 0.6                            | ; distancia hx hy
 * 
 * */
	private Ponto origemCamera;
	private Vetor n;
	private Vetor v;
	private Vetor u;
	private double distancia;
	private double hx;
	private double hy;
	
	private Cena cena;
	private Objeto projecao;
	
	private double[][] zBuffer;
	private double[][] xNormalBuffer;
	private double[][] yNormalBuffer;
	private double[][] zNormalBuffer;
	
	//private Image image;
	
	public Camera(Ponto origemCamera, Vetor n, Vetor v, double distancia, double hx,double hy) {
		this.origemCamera = origemCamera;
		this.n = n;
		this.v = v;
		this.distancia = distancia;
		this.hx = hx;
		this.hy = hy;	
	}	
	
	public Vetor calculaVetorQueApontaParaCameraV(Ponto ponto){
		//V -> vetor que aponta para a camera
		Ponto origem = new Ponto(0,0,0);
		Vetor retorno = origem.subtrai(ponto);
		retorno.normalizar();

		return retorno;
	}

	public Ponto getOrigemCamera() {
		return origemCamera;
	}

	public void setOrigemCamera(Ponto origemCamera) {
		this.origemCamera = origemCamera;
	}

	public Vetor getN() {
		return n;
	}
	
	public void setU(Vetor u) {
		this.u = u;
	}
	
	public Vetor getU() {
		return u;
	}
	
	public void setN(Vetor n) {
		this.n = n;
	}

	public Vetor getV() {
		return v;
	}

	public void setV(Vetor v) {
		this.v = v;
	}

	public double getDistancia() {
		return distancia;
	}

	public void setDistancia(double distancia) {
		this.distancia = distancia;
	}

	public double getHx() {
		return hx;
	}

	public void setHx(double hx) {
		this.hx = hx;
	}

	public double getHy() {
		return hy;
	}

	public void setHy(double hy) {
		this.hy = hy;
	}
	
	public void inicializar(){
		this.n = this.n.normalizar();
		
		Vetor tempU = this.v.normalizar();
		Vetor nProjV = this.n;
		
		this.v = tempU.sub(nProjV.multiplicarEscalar(nProjV.produtoEscalar(tempU)));
		this.v = v.normalizar();
		
		this.u = this.n.produtoVetorial(this.v);
		this.u = this.u.normalizar();
		
	//	imagem = create_bitmap((int) (2*hx), (int) (2*hy));
		
		double[][] zBuffer = new double[(int)(2*this.hx)][(int)(2*this.hy)];
		
		for(int i = 0; i < (int)(2*this.hx); i++)
		{
			for(int j = 0; j < (int)(2*this.hy); j++)
			{
				zBuffer[i][j] = Double.MAX_VALUE;
			}
		}
				
	}
	
	/**
	 * Transforma um ponto das coordenadas do mundo para as coordenadas da c�mera.
	 * @param ponto O ponto nas coordenadas do mundo
	 * @return O vetor nas coordenadas da c�mera
	 */
	Vetor transformaPontoSCC(Ponto ponto)
	{
		Vetor projetado = ponto.subtrai(origemCamera);
		
		projetado.set(this.u.getX() * projetado.getX() + this.u.getY() * projetado.getY()
				+ this.u.getZ() * projetado.getZ(), this.v.getX() * projetado.getX() + this.v.getY()
				* projetado.getY() + this.v.getZ() * projetado.getZ(), this.n.getX() * projetado.getX()
				+ this.n.getY() * projetado.getY() + this.n.getZ() * projetado.getZ());

		return projetado;
	}
	

	
}
